PRELOADER

不念过去 不负现在 不畏将来

当前文章 : 《STM32 串口通信》

12/4/2018 —— 

STM32 串口通信

项目说明

使用STM32的串口与PC进行通信,使用的芯片为232或者485。从电脑端发送一和数值,STM32接收完成后通过中断函数进行加1操作,之后再通过串口发送到电脑进行显示。

知识点

  • 1、串口操作的一般步骤。

(1) 打开 GPIO 的时钟使能和 USART 的时钟使能。

(2) 设置串口 IO 的 IO 口模式。 (一般输入是模拟输入, 输出是复用推挽输出)

(3) 初始化 USART。 (包括设置波特率、数据长度、停止位、效验位等)

(4) 如果使用中断接收的话,那么还要设置 NVIC 并打开中断使能。(即设置 设置它的中断优先级。 )

  • 2、串口中断函数的操作步骤

(1)发送标志位清零。这一步主要是用于清空下面会执行到的发送数据的标志位。
(2)判断中断是否发生
(3)获取接收的数据并且加1后进行发送。
(4)判断是否发送完成,若完成就退中断。

  • 3、232芯片和485芯片都可以用作与PC进行通信,两者的代码差不多,但是232芯片为全双工通信,而485芯片为半双工通信。因此,485芯片比232芯片会多一个控制发送还是接收的使能管脚,需要通过该管脚进行置0或置1进行发送或者接收的切换。

部分代码

  • 1、设置USART
    `c
    USART_InitStructure.USART_BaudRate=9600; //波特率设置为9600 //波特率
    USART_InitStructure.USART_WordLength=USART_WordLength_8b; //数据长8位
    USART_InitStructure.USART_StopBits=USART_StopBits_1; //1位停止位
    USART_InitStructure.USART_Parity=USART_Parity_No; //无效验
    USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //失能硬件流
    USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; //开启发送和接受模式
    USART_Init(USART1,&USART_InitStructure); / 初始化USART1 /
    USART_Cmd(USART1, ENABLE); / 使能USART1 /
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//使能或者失能指定的USART中断 接收中断
    USART_ClearFlag(USART1,USART_FLAG_TC);//清除USARTx的待处理标志位

- 2、设置NVIC
```c
/* 设置NVIC参数 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;        //打开USART1的全局中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;      //抢占优先级为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;             //响应优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;              //使能
NVIC_Init(&NVIC_InitStructure);

  • 3、中断函数
    void USART1_IRQHandler(void)    //串口1中断函数
    {
      static u8 k;
      USART_ClearFlag(USART1,USART_FLAG_TC);
      if(USART_GetITStatus(USART1,USART_IT_RXNE)!=Bit_RESET)//检查指定的USART中断发生与否
      {
          k=USART_ReceiveData(USART1);
          k++;
          USART_SendData(USART1,k);//通过外设USARTx发送单个数据
          while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==Bit_RESET);    //判断是否发送完成
      }
    }